 '  ********************************************

 '  *     ACNET 05-01 - NETWORK MESH ANALYSIS       *

 '  ********************************************

10 SCREEN 9, 1: COLOR 15, 1: CLS

12 LOCATE 1, 20: PRINT "NETWORK MESH ANALYSIS": PRINT : PRINT

20 PI = 3.141592653589793#: PI2 = 2 * PI: ERFLG = 0

30 PRINT "A UNIT VOLTAGE SOURCE IS ASSUMED FOR MESH 11"

40 INPUT "ENTER DESIRED FREQUENCY RANGE (FMIN, FMAX)"; FMN, FMX

50 INPUT "ENTER NUMBER OF FREQUENCY STEPS PER DECADE"; DELF

60 FBOT = INT(LOG(FMN) / LOG(10)) ' COMMON LOG FMN

70 FTOP = INT(LOG(FMX) / LOG(10)) ' COMMON LOG FMX

80 IF LOG(FMX) / LOG(10) - FTOP > .000001 THEN FTOP = FTOP + 1

90 FSTEP = 10 ^ (1 / DELF) ' FREQ STEP MULTIPLIER

100 INPUT "ENTER THE NUMBER OF MESHES"; KB

110 DIM COMP(3, KB, KB), Z(2, KB, KB + 1), F(2, ((FTOP - FBOT) * DELF) + 1)

120 GOSUB 20000 ' INPUT CIRCUIT ELEMENTS

130 GOSUB 10000 ' CALCULATE XFER IMPEDANCE

140 CLS : LOCATE 2, 20: PRINT "OUTPUT MENU"

150 PRINT : PRINT "  1 = PLOT DATA"

155 PRINT : PRINT "  2 = PRINT DATA (TO SCREEN)"

160 PRINT : PRINT "  3 = OUTPUT TO PRINTER"

170 LOCATE 18, 3: PRINT "9 = EXIT"

180 PRINT : PRINT "     INPUT SELECTON"

190 A$ = INKEY$: IF A$ = "" THEN 190

200 ON VAL(A$) GOSUB 800, 10090, 600, 235, 235, 235, 235, 235, 240

230 GOTO 140

235 RETURN

240 END



 '  ***********************************

 '  *     PRINT OUTPUT TO PRINTER         *

 '  ***********************************

600 INPUT "CIRCUIT NAME "; A$

605 LPRINT DATE$, TIME$: LPRINT : LPRINT A$: LPRINT : LPRINT

610 F0 = 10 ^ FBOT: F = F0: PLC = 52

615 FOR I = 1 TO ((FTOP - FBOT) * DELF) + 1

620 LPRINT USING "#####.##_        "; F; ' PRINT FREQUENCY

625 LPRINT USING "##.####_ "; F(1, I) * RTERM; ' PRINT VOLTAGE

630 J$ = "+j ": IF SGN(F(2, I)) < 0 THEN J$ = "-j "

635 LPRINT J$; : LPRINT USING "##.####_     "; ABS(F(2, I) * RTERM);

640 MAG = SQR(F(1, I) ^ 2 + F(2, I) ^ 2)

642 IF MAG = 0 THEN LPRINT "0.00000 / 0.00": GOTO 660

644 LPRINT USING "##.#####_ "; RTERM * MAG; : LPRINT " /";

646 IF F(1, I) = 0 AND F(2, I) >= 0 THEN BTA = PI / 2: GOTO 655

648 IF F(1, I) = 0 AND F(2, I) < 0 THEN BTA = -PI / 2: GOTO 655

650 BTA = ATN(F(2, I) / F(1, I)): IF F(1, I) < 0 THEN BTA = BTA + PI

655 LPRINT USING "###.##"; BTA * 180 / PI ' PRINT DEGREES PHASE

660 IF I < PLC THEN 690 ' CHK END OF PAGE

665 LPRINT "                           (MORE)"

670 LPRINT CHR$(12) ' FORM FEED

675 PLC = PLC + 52 ' SET END OF NEXT PAGE

680 FOR LCTR = 1 TO 3: LPRINT : NEXT ' PRINT HEAD SPACE

690 F = F0 * FSTEP ^ I' SET NEXT FREQUENCY

692 NEXT I ' PRINT NEXT LINE

694 LPRINT CHR$(12) ' FORM FEED FINAL PAGE

698 RETURN



 '  ***********************************

 '  *          PLOT XFER FUNCTION          *

 '  ***********************************

800 SCREEN 9, 1: COLOR 15, 1: CLS ' SELECT 640 x 350 RESOLUTION

810 X0 = 20: Y0 = 20: YX = 320: XX = 620 ' 600 x 300 GRAPH

812 LINE (X0, Y0)-(X0, YX) ' DRAW COORDINATES

814 LINE (X0, YX)-(XX, YX)

820 FREQNO = (FTOP - FBOT) * DELF: YMAX = 0

822 FOR I = 1 TO FREQNO

824 Y1 = SQR(F(1, I) ^ 2 + F(2, I) ^ 2)

826 IF Y1 > YMAX THEN YMAX = Y1

828 NEXT I

830 KX = 600 / FREQNO: KY = 200 / (YMAX * RTERM)

832 LOCATE 8, 1: PRINT YMAX * RTERM

834 Y1 = RTERM * SQR(F(1, 1) ^ 2 + F(2, 1) ^ 2)

836 LINE (X0, YX - (KY * Y1))-(X0, YX - (KY * Y1))

840 FOR I = 1 TO FREQNO

842 Y1 = RTERM * SQR(F(1, I) ^ 2 + F(2, I) ^ 2)

844 LINE -(X0 + (I - 1) * KX, YX - (KY * Y1))

846 NEXT

848 LOCATE 24, 2: PRINT 10 ^ FBOT; : LOCATE 24, 73: PRINT 10 ^ FTOP;

850 LOCATE 25, 30: PRINT "FREQUENCY"; : LOCATE 25, 2

852 INPUT A$

854 RETURN

 '  ***********************************

 '  *       CALCULATE XFER FUNCTION       *

 '  ***********************************

10000 F0 = 10 ^ FBOT: F = F0: FREQ = 0 ' FREQ = DATA POINT COUNTER

10010 GOSUB 11000 ' CALC IMPEDANCE MATRIX

10020 GOSUB 12000 ' SOLVE FOR CURRENTS

10040  '  GOSUB 13000 ' PRINT OUT CURRENTS

10050 FREQ = FREQ + 1 ' SET FOR NEXT DATA POINT

10060 F(1, FREQ) = Z(1, KB, KB + 1): F(2, FREQ) = Z(2, KB, KB + 1)' SAVE

10070 F = F0 * FSTEP ^ FREQ ' GET NEXT FREQUENCY

10080 IF F <= FMX + .1 THEN 10010 ' JOB DONE?

10090 CLS : PLC = 22 ' CLEAR SCREEN FOR PRINTOUT

10100 F = 10 ^ FBOT ' GET BOTTOM FREQUENCY

10110 FOR I = 1 TO ((FTOP - FBOT) * DELF) + 1

10120 PRINT USING "#####.##_    "; F; ' PRINT FREQUENCY

10130 PRINT USING "##.####_   "; F(1, I) * RTERM; ' ? REAL COMPONENT

10140 J$ = "+j ": IF SGN(F(2, I)) < 0 THEN J$ = "-j "

10150 PRINT " "; J$;

10160 PRINT USING "#.####_    "; ABS(F(2, I) * RTERM); 'PRINT IMAGINARY

10170 MAG = SQR(F(1, I) ^ 2 + F(2, I) ^ 2) ' FIND MAGNITUDE

10180 IF MAG = 0 THEN PRINT "0.0000 /0.00": GOTO 10240

10190 PRINT USING "#.#####_ "; RTERM * MAG; : PRINT " /";

10200 IF F(1, I) = 0 AND F(2, I) >= 0 THEN BTA = PI / 2: GOTO 10230

10210 IF F(1, I) = 0 AND F(2, I) < 0 THEN BTA = -PI / 2: GOTO 10230

10220 BTA = ATN(F(2, I) / F(1, I)): IF F(1, I) < 0 THEN BTA = BTA + PI

10230 PRINT USING "###.##"; BTA * 180 / PI ' PRINT PHASE IN DEG.

10240 IF I < PLC THEN 10270 ' SCREEN FULL?

10250 PLC = PLC + 22: PRINT "                           (MORE)"

10260 INPUT "ENTER TO CONTINUE"; A$ ' WAIT FOR USER

10270 F = F0 * FSTEP ^ I' NEXT FREQ

10280 NEXT I ' PRINT NEXT COMPONENT

10290 INPUT "ENTER TO CONTINUE"; A$ ' WAIT

10300 RETURN ' WERE OUTA HERE



 '  ***********************************

 '  *          COMPUTE IMPEDANCE        *

 '  ***********************************

11000 CLS : WF = PI2 * F ' GET ANGULAR FREQUENCY

11002 LOCATE 10, 10: PRINT "SOLVING FOR TRANSFER FUNCTION"

11010 FOR I = 1 TO KB ' FOR ALL MESHES

11020 Z(1, I, I) = COMP(1, I, I) ' GET RESISTOR VALUE

11030 IF COMP(3, I, I) = 0 THEN Z(2, I, I) = WF * COMP(2, I, I): GOTO 11060

11040 IF F = 0 THEN Z(2, I, I) = -1E+18: GOTO 11060

11050 Z(2, I, I) = WF * COMP(2, I, I) - 1 / (WF * COMP(3, I, I))

11060 FOR J = I + 1 TO KB ' GET MUTUAL IMPEDANCES

11070 Z(1, I, J) = -COMP(1, I, J) ' MUTUAL RESISTANCE

11080 IF COMP(3, I, J) = 0 THEN Z(2, I, J) = -WF * COMP(2, I, J): GOTO 11110

11090 IF F = 0 THEN Z(2, I, J) = 1E+18: GOTO 11110' FUDGE DC CAP

11100 Z(2, I, J) = -(WF * COMP(2, I, J) - 1 / (WF * COMP(3, I, J)))

11110 Z(2, J, I) = Z(2, I, J): Z(1, J, I) = Z(1, I, J)

11120 NEXT J ' NEXT MUTUAL IMPEDANCE

11130 NEXT I ' NEXT MESH

11140 Z(1, 1, KB + 1) = 1: Z(2, 1, KB + 1) = 0 ' DRIVE POINT VOLTAGE

11150 FOR I = 2 TO KB ' SET ALL OTHER MESH VOLTAGE SOURCES (ZERO)

11160 Z(1, I, KB + 1) = 0: Z(2, I, KB + 1) = 0 ' ALL ZERO

11170 NEXT I

11250 RETURN



 '  ***********************************

 '  *          SOLVE FOR CURRENTS       *

 '  ***********************************

12000 FOR J = 1 TO KB ' STEP THROUGH ALL DIAGONAL LOCATIONS

12200  '  GET A "1" COEFFICIENT ON THE DIAGONAL

12210 IF Z(2, J, J) = 0 THEN ZRE = 1 / Z(1, J, J): ZIM = 0: GOTO 12300

12220 IF Z(1, J, J) = 0 THEN ZRE = 0: ZIM = -1 / Z(2, J, J): GOTO 12300

12230 BTA = ATN(Z(2, J, J) / Z(1, J, J)): IF Z(1, J, J) < 0 THEN BTA = BTA + PI

12240 BTA = .5 * SIN(2 * BTA)

12250 ZRE = BTA / Z(2, J, J): ZIM = -BTA / Z(1, J, J)' INVERT Z(x,J,J)

12300 FOR K = J TO KB + 1

12310 Z1 = Z(1, J, K) * ZRE - (Z(2, J, K) * ZIM)

12315 Z(2, J, K) = Z(1, J, K) * ZIM + (Z(2, J, K) * ZRE): Z(1, J, K) = Z1

12320 NEXT K

12330 FOR I = 1 TO KB ' GET 0 IN THIS COL. FOR ALL OTHER EQNS.

12340 IF I = J THEN 12400

12350 XT = Z(1, I, J): YT = Z(2, I, J): IF XT = 0 AND YT = 0 THEN 12400

12360 FOR K = J + 1 TO KB + 1' DON'T BOTHER WITH "ZERO" POSITIONS

12370 Z(1, I, K) = Z(1, I, K) - (Z(1, J, K) * XT - (Z(2, J, K) * YT))

12380 Z(2, I, K) = Z(2, I, K) - (Z(1, J, K) * YT + (Z(2, J, K) * XT))

12390 NEXT K

12400 NEXT I

12410 NEXT J ' REPEAT FOR ALL DIAGONAL POSITIONS.

12420 RETURN

 '  ***********************************

 '  *          PRINTOUT CURRENTS        *

 '  ***********************************

13000 CLS : PRINT

13010 FOR I = 1 TO KB

13020 PRINT "I"; I; "=";

13030 PRINT USING "###.###"; Z(1, I, KB + 1);

13040 PRINT "+j";

13050 PRINT USING "###.###"; Z(2, I, KB + 1)

13060 NEXT I

13080 RETURN



 '  ***********************************

 '  *       INPUT CIRCUIT ELEMENTS     *

 '  ***********************************

20000 PRINT : PRINT "                INPUT CIRCUIT ELEMENTS"

20010 PRINT : GOSUB 21000 ' PRINT INSTRUCTIONS

20020 FOR I = 1 TO KB

20030 CLS : PRINT : PRINT "INPUT VALUES FOR MESH "; I: PRINT

20040 PRINT "ENTER MESH SELF RESISTANCE, INDUCTANCE, CAPACITANCE";

20050 INPUT COMP(1, I, I), COMP(2, I, I), COMP(3, I, I)

20060 FOR J = I + 1 TO KB

20070 PRINT "ENTER MESH ";

20080 PRINT USING "##_ "; I; J;

20090 PRINT " MUTUAL RESISTANCE, INDUCTANCE, CAPACITANCE";

20100 INPUT COMP(1, I, J), COMP(2, I, J), COMP(3, I, J)

20110 COMP(1, J, I) = COMP(1, I, J): COMP(2, J, I) = COMP(2, I, J)

20125 COMP(3, J, I) = COMP(3, I, J)

20130 NEXT J

20140 NEXT I

20150 INPUT "ENTER TERMINATION RESISTANCE"; RTERM

20160 RETURN



 '  ***************************************

 '  *               INSTRUCTIONS                 *

 '  ***************************************

21000 PRINT "1) LAYOUT CIRCUIT INTO MESHES"

21010 PRINT "2) MESH SELF IMPEDANCE = ";

21015 PRINT "SERIES SUMMATION OF ALL IMPEDANCES IN LOOP"

21020 PRINT "3) MESH MUTUAL IMPEDANCE = ";

21025 PRINT "COMMON IMPEDANCES BETWEEN LOOPS"

21030 INPUT "ENTER TO CONTINUE"; A$

21040 RETURN



